package ch.utilities;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ch.exception.BadMySQLDateFormatException;


/** Classe per la formattazione della data MySQL tramite typeField (in stile printf di C).
*
* @author Neil Otupacca - May 21 2011
*
*/
public class MySQLDateFormatter {

	private HashMap<String, String> formatFieldsData;

	/** 
	 *
	 * @param mysqlDate
	 */
	public MySQLDateFormatter(String mysqlDate) {
		String re = "^(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})$";
		Pattern pat = Pattern.compile(re);
		Matcher matcher = pat.matcher(mysqlDate);

		// Errore di formato
		if (!matcher.find()) throw new BadMySQLDateFormatException();

		formatFieldsData = new HashMap<String, String>();
		formatFieldsData.put("Y", matcher.group(1));  // Anno
		formatFieldsData.put("M", matcher.group(2));  // Mese
		formatFieldsData.put("D", matcher.group(3));  // Giorno
		formatFieldsData.put("h", matcher.group(4));  // Ora
		formatFieldsData.put("m", matcher.group(5));  // Minuto
		formatFieldsData.put("s", matcher.group(6));  // Secondo
	}

	/** Ritorna la data MySQL formattata tramite <i>typeField</i> (in stile
	 * <i>printf()</i> di <b>C</b>).<br>
	 * <table>
	 *   <tr><td><li><b>%D</b></li></td><td>: giorno</td></tr>
	 *   <tr><td><li><b>%M</b></li></td><td>: mese</td></tr>
	 *   <tr><td><li><b>%Y</b></li></td><td>: anno</td></tr>
	 *   <tr><td><li><b>%h</b></li></td><td>: ora</td></tr>
	 *   <tr><td><li><b>%m</b></li></td><td>: minuto</td></tr>
	 *   <tr><td><li><b>%s</b></li></td><td>: secondo</td></tr>
	 *   <tr><td><li><b>%%</b></li></td><td>: carattere '%' letterale</td></tr>
	 * </table>
	 *
	 * @param format - stringa di formattazione.
	 * @return stringa della data formattata.
	 */
	public String formatDate(String format) {
		String fields[] = format.split("%");
		String formattedDate = fields[0];

		for ( int n = 1 ; n < fields.length ; n++ ) {
			// Escape %% per il carattere letterale '%'
			if (fields[n].length() <= 0) formattedDate += "%";
			else {
				if (formatFieldsData.containsKey(fields[n].substring(0, 1))) {
					// Se il field è riconosciuto, sostituisci il place-holder
					formattedDate += formatFieldsData.get(fields[n].substring(0, 1));

					// Concatena l'eventuale resto del token (dal secondo carattere in poi)
					formattedDate += fields[n].substring(1);
				}
				// Se il field non è riconosciuto, inserisci 'intero token
				else formattedDate += fields[n];
			}
		}

		return(formattedDate);
	}
}
